home *** CD-ROM | disk | FTP | other *** search
- #! /bin/bash
- ###############################################################################
- # Conveniently create and set scsi logging level, show SCSI_LOG fields in human
- # readable form.
- #
- # (C) Copyright IBM Corp. 2006
- ###############################################################################
-
-
- REVISION="1.0"
- SCRIPTNAME="scsi_logging_level"
-
- declare -i LOG_ERROR=0
- declare -i LOG_TIMEOUT=0
- declare -i LOG_SCAN=0
- declare -i LOG_MLQUEUE=0
- declare -i LOG_MLCOMPLETE=0
- declare -i LOG_LLQUEUE=0
- declare -i LOG_LLCOMPLETE=0
- declare -i LOG_HLQUEUE=0
- declare -i LOG_HLCOMPLETE=0
- declare -i LOG_IOCTL=0
-
- declare -i LEVEL=0
-
- SET=0
- GET=0
- CREATE=0
-
- OPTS=`getopt -o hvcgsa:E:T:S:I:M:L:H: --long \
- help,version,create,get,set,all:,error:,timeout:,scan:,ioctl:,\
- midlevel:,mlqueue:,mlcomplete:,lowlevel:,llqueue:,llcomplete:,\
- highlevel:,hlqueue:,hlcomplete: -n \'$SCRIPTNAME\' -- "$@"`
- eval set -- "$OPTS"
-
- # print version info
- printversion()
- {
- cat <<EOF
- %S390_TOOLS_VERSION% ($SCRIPTNAME $REVISION)
- (C) Copyright IBM Corp. 2006
- EOF
- }
-
- # print usage and help
- printhelp()
- {
- cat <<EOF
- Usage: $SCRIPTNAME [OPTIONS]
-
- Create, get or set scsi logging level.
-
- Options:
-
- -h, --help print this help
- -v, --version print version information
- -s, --set create and set logging level as specified on
- command line
- -g, --get get current logging level and display it
- -c, --create create logging level as specified on command line
- -a, --all specify value for all SCSI_LOG fields
- -E, --error specify SCSI_LOG_ERROR
- -T, --timeout specify SCSI_LOG_TIMEOUT
- -S, --scan specify SCSI_LOG_SCAN
- -M, --midlevel specify SCSI_LOG_MLQUEUE and SCSI_LOG_MLCOMPLETE
- --mlqueue specify SCSI_LOG_MLQUEUE
- --mlcomplete specify SCSI_LOG_MLCOMPLETE
- -L, --lowlevel specify SCSI_LOG_LLQUEUE and SCSI_LOG_LLCOMPLETE
- --llqueue specify SCSI_LOG_LLQUEUE
- --llcomplete specify SCSI_LOG_LLCOMPLETE
- -H, --highlevel specify SCSI_LOG_HLQUEUE and SCSI_LOG_HLCOMPLETE
- --hlqueue specify SCSI_LOG_HLQUEUE
- --hlcomplete specify SCSI_LOG_HLCOMPLETE
- -I, --ioctl specify SCSI_LOG_IOCTL
-
- Exactly one of the options "-c", "-g" and "-s" has to be specified.
- Valid values for SCSI_LOG fields are integers from 0 to 7.
-
- Note: Several SCSI_LOG fields can be specified using several options.
- When multiple options specify same SCSI_LOG field the most specific
- option has precedence.
-
- Example: "scsi_logging_level --hlqueue 3 --highlevel 2 --all 1 -s" sets
- SCSI_LOG_HLQUEUE=3, SCSI_LOG_HLCOMPLETE=2 and assigns all other SCSI_LOG
- fields the value 1.
- EOF
- }
-
- check_level()
- {
- if [ `echo -n $1 | tr --complement [:digit:] 'a' | grep -s 'a'` ]
- then
- invalid_cmdline "log level '$1' out of range [0, 7]"
- fi
-
- if [ $1 -lt 0 -o $1 -gt 7 ]
- then
- invalid_cmdline "log level '$1' out of range [0, 7]"
- fi
- }
-
- # check cmd line arguments
- check_cmdline()
- {
- while true ; do
- case "$1" in
- -a|--all) _ALL=$2; check_level $2
- shift 2;;
- -c|--create) CREATE=1;
- shift 1;;
- -g|--get) GET=1
- shift 1;;
- -h|--help) printhelp
- exit 0;;
- -s|--set) SET=1
- shift 1;;
- -v|--version) printversion
- exit 0;;
- -E|--error) _ERROR=$2; check_level $2
- shift 2;;
- -T|--timeout) _TIMEOUT=$2; check_level $2
- shift 2;;
- -S|--scan) _SCAN=$2; check_level $2
- shift 2;;
- -M|--midlevel) _ML=$2; check_level $2
- shift 2;;
- --mlqueue) _MLQUEUE=$2; check_level $2
- shift 2;;
- --mlcomplete) _MLCOMPLETE=$2; check_level $2
- shift 2;;
- -L|--lowlevel) _LL=$2; check_level $2
- shift 2;;
- --llqueue) _LLQUEUE=$2; check_level $2
- shift 2;;
- --llcomplete) _LLCOMPLETE=$2; check_level $2
- shift 2;;
- -H|--highlevel) _HL=$2; check_level $2
- shift 2;;
- --hlqueue) _HLQUEUE=$2; check_level $2
- shift 2;;
- --hlcomplete) _HLCOMPLETE=$2; check_level $2
- shift 2;;
- -I|--ioctl) _IOCTL=$2; check_level $2
- shift 2;;
- --) shift; break;;
- *) echo "Internal error!" ; exit 1;;
- esac
- done
-
- if [ -n "$*" ]
- then
- invalid_cmdline invalid parameter $*
- fi
-
- if [ $GET = "1" -a $SET = "1" ]
- then
- invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive
- elif [ $GET = "1" -a $CREATE = "1" ]
- then
- invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive
- elif [ $SET = "1" -a $CREATE = "1" ]
- then
- invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive
- fi
-
- LOG_ERROR=${_ERROR:-${_ALL:-0}}
- LOG_TIMEOUT=${_TIMEOUT:-${_ALL:-0}}
- LOG_SCAN=${_SCAN:-${_ALL:-0}}
- LOG_MLQUEUE=${_MLQUEUE:-${_ML:-${_ALL:-0}}}
- LOG_MLCOMPLETE=${_MLCOMPLETE:-${_ML:-${_ALL:-0}}}
- LOG_LLQUEUE=${_LLQUEUE:-${_LL:-${_ALL:-0}}}
- LOG_LLCOMPLETE=${_LLCOMPLETE:-${_LL:-${_ALL:-0}}}
- LOG_HLQUEUE=${_HLQUEUE:-${_HL:-${_ALL:-0}}}
- LOG_HLCOMPLETE=${_HLCOMPLETE:-${_HL:-${_ALL:-0}}}
- LOG_IOCTL=${_IOCTL:-${_ALL:-0}}
- }
-
- invalid_cmdline()
- {
- echo "$SCRIPTNAME: $*"
- echo "$SCRIPTNAME: Try '$SCRIPTNAME --help' for more information."
- exit 1
- }
-
- get_logging_level()
- {
- echo "Current scsi logging level:"
- LEVEL=`sysctl -n dev.scsi.logging_level`
- if [ $? != 0 ]
- then
- echo "$SCRIPTNAME: could not read scsi logging level" \
- "(kernel probably without SCSI_LOGGING support)"
- exit 1
- fi
- }
-
- show_logging_level()
- {
- echo "dev.scsi.logging_level = $LEVEL"
-
- LOG_ERROR=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
- LOG_TIMEOUT=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
- LOG_SCAN=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
- LOG_MLQUEUE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
- LOG_MLCOMPLETE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
- LOG_LLQUEUE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
- LOG_LLCOMPLETE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
- LOG_HLQUEUE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3));
- LOG_HLCOMPLETE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3));
- LOG_IOCTL=$(($LEVEL & 7))
-
- echo "SCSI_LOG_ERROR=$LOG_ERROR"
- echo "SCSI_LOG_TIMEOUT=$LOG_TIMEOUT"
- echo "SCSI_LOG_SCAN=$LOG_SCAN"
- echo "SCSI_LOG_MLQUEUE=$LOG_MLQUEUE"
- echo "SCSI_LOG_MLCOMPLETE=$LOG_MLCOMPLETE"
- echo "SCSI_LOG_LLQUEUE=$LOG_LLQUEUE"
- echo "SCSI_LOG_LLCOMPLETE=$LOG_LLCOMPLETE"
- echo "SCSI_LOG_HLQUEUE=$LOG_HLQUEUE"
- echo "SCSI_LOG_HLCOMPLETE=$LOG_HLCOMPLETE"
- echo "SCSI_LOG_IOCTL=$LOG_IOCTL"
- }
-
- set_logging_level()
- {
- echo "New scsi logging level:"
- sysctl -q -w dev.scsi.logging_level=$LEVEL
- if [ $? != 0 ]
- then
- echo "$SCRIPTNAME: could not write scsi logging level" \
- "(kernel probably without SCSI_LOGGING support)"
- exit 1
- fi
- }
- create_logging_level()
- {
- LEVEL=$(($LOG_IOCTL & 7)); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_HLCOMPLETE & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_HLQUEUE & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_LLCOMPLETE & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_LLQUEUE & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_MLCOMPLETE & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_MLQUEUE & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_SCAN & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_TIMEOUT & 7))); LEVEL=$(($LEVEL<<3))
- LEVEL=$(($LEVEL|($LOG_ERROR & 7)))
- }
-
- check_cmdline $*
-
- if [ $SET = "1" ]
- then
- create_logging_level
- set_logging_level
- show_logging_level
- elif [ $GET = "1" ]
- then
- get_logging_level
- show_logging_level
- elif [ $CREATE = "1" ]
- then
- create_logging_level
- show_logging_level
- else
- invalid_cmdline missing option \'-g\', \'-s\' or \'-c\'
- fi
-